package io.renren.common.utils.docx;

import org.docx4j.TraversalUtil;
import org.docx4j.finders.RangeFinder;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.*;

import java.io.*;
import java.util.List;

public class DocxFormat {
    public static void main(String[] args) {
        final String templatePath = "D:\\aa.docx";
        final String targetPath = "D:\\text.docx";
        final String bookmarkName = "signature";
        final String imagePath = "D:\\signature.png";
        try {
            insertPicture(templatePath, targetPath, bookmarkName, imagePath);
        } catch (Exception e) {

            e.printStackTrace();
        }
    }


    /**
     * Method Description:使用docx4j插入图片
     *
     * @param templatePath // 模板文件路径
     * @param targetPath   // 生成的文件路径
     * @param bookmarkName // 书签名
     * @param imagePath    void // 图片路径
     * @throws Exception
     * @Author: 张昊亮
     * @Date: 2018年5月17日 下午4:17:20
     */
    public static void insertPicture(String templatePath, String targetPath, String bookmarkName, String imagePath) throws Exception {

        long startTime=System.currentTimeMillis();
        // 载入模板文件
        WordprocessingMLPackage wPackage = WordprocessingMLPackage.load(new FileInputStream(templatePath));
        // 提取正文
        MainDocumentPart mainDocumentPart = wPackage.getMainDocumentPart();
        Document wmlDoc = (Document) mainDocumentPart.getJaxbElement();
        Body body = wmlDoc.getBody();
        // 提取正文中所有段落
        List<Object> paragraphs = body.getContent();
        // 提取书签并创建书签的游标
        RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");
        new TraversalUtil(paragraphs, rt);
        // 遍历书签
        for (CTBookmark bm : rt.getStarts()) {
            if (bm.getName().equals("guest")){
                Tool.replaceText(bm, "刘子弹");
            }
            if (bm.getName().equals("model")){
                Tool.replaceText(bm, "型号1");
            }
            if (bm.getName().equals("serial")){
                Tool.replaceText(bm, "系列号1");
            }
            if (bm.getName().equals("check1")){
                Tool.replaceText(bm, "□");
            }
            if (bm.getName().equals("check2")){
                Tool.replaceText(bm, "☑");
            }

            // 这儿可以对单个书签进行操作，也可以用一个map对所有的书签进行处理
            if (bm.getName().equals(bookmarkName)) {

                Tool.addImage(wPackage,bm,imagePath);

            }
        }
        wPackage.save(new FileOutputStream(targetPath));
        System.out.println(System.currentTimeMillis()-startTime);

    }



}
